Abstract
It provides an interface for creating families of related or dependent objects without specifying their concrete classes. This pattern is especially useful when your system needs to create different types of objects that belong to a group, where each object group is logically related but differs in concrete implementation.
Structure
Abstract Product: Declares an interface for a type of product object.Abstract Factory: Declares an interface for creating abstract products.Concrete Product: Implements the interface to create specific products.Concrete Factory: Implements the interface to create concrete products.Client: Uses the factory methods to create objects but remains unaware of their concrete implementation.
Example
// Abstract product for Button
interface Button{
public void paint();
}
// Abstract product for Checkbox
interface CheckBox{
public void paint();
}
// Concrete product for Windows Button
class WindowsButton implements Button{
public void paint(){
System.out.println("Windows Button");
}
}
// Concrete product for MacOS Button
class MacButton implements Button{
public void paint(){
System.out.println("Mac Button");
}
}
// Concrete product for Windows Checkbox
class WindowsCheckbox implements CheckBox{
public void paint(){
System.out.println("Windows Checkbox");
}
}
// Concrete product for MacOS Checkbox
class MacCheckbox implements CheckBox{
public void paint(){
System.out.println("Mac Checkbox");
}
}
// Abstract factory
interface GUIFactory{
public Button createButton();
public CheckBox createCheckbox();
}
// Concrete factory for Windows
class WindowsFactory implements GUIFactory{
public Button createButton(){
return new WindowsButton();
}
public CheckBox createCheckbox(){
return new WindowsCheckbox();
}
}
// Concrete factory for MacOS
class MacFactory implements GUIFactory{
public Button createButton(){
return new MacButton();
}
public CheckBox createCheckbox(){
return new MacCheckbox();
}
}
// Client class
class Client{
private Button button;
private CheckBox checkBox;
Client(GUIFactory factory){
button = factory.createButton();
checkBox = factory.createCheckbox();
}
public void paint(){
button.paint();
checkBox.paint();
}
}
// Implementation
class Main{
public static void main(String[] args){
GUIFactory factory;
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("mac")) {
factory = new MacFactory();
}else{
factory = new WindowsFactory();
}
Client client = new Client(factory);
client.paint();
}
}